package com.xunfang.service;

import com.xunfang.bean.Book;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * @author yellow Doctor
 * @date 2025-10-10
 * @desc https://blog.csdn.net/hekai7217
 */
@Service
public class BookServiceImpl implements BookService{

    // 1、自定义注解
    // 2、aop 来解析  @Cacheable 实现业务逻辑
    // 3、把上面的代码封装成start 就成了 SpringCache 框架

    //先从缓存中查找，如果找不到，再从数据库中查找，然后把结果存入缓存中
    @Cacheable(cacheNames = "books", key = "#id")  //books::1  存储到redis中  book
    public Book findById(Integer id) {
        // 假设这里从数据库中查询到了一本书
        Book book = new Book();
        book.setId(id);
        book.setName("Java编程思想");
        book.setAuthor("Bruce Eckel");
        System.out.println("访问数据库通过" + id + "查询一本书");
        return book;
    }

    //如果频繁的修改数据 或者 删除数据 不要存储在redis中

    @Override
    //先更新数据库，然后更新缓存
    @CachePut(cacheNames = "books", key = "#book.id")
    public Book update(Book book) {
        System.out.println("更新数据库 book = " + book);
        return null;
    }

    @Override
    //先删除数据库中的数据，然后删除缓存中的数据
    @CacheEvict(cacheNames = "books", key = "#id")
    public void delete(Integer id) {

    }

    //先删除数据库中的所有数据，然后删除缓存中这个名字下所有数据
    @CacheEvict(cacheNames = "books", allEntries = true)
    @Override
    public void deleteAll() {

    }

}
